版权说明:本文为原创文章,未经允许,不得转载。
类和对象
1.类的概念
类是对同一类事物的抽象,类中定义了这一类对象中所具有的静态属性(属性)和动态属性(方法)。
2.类和对象
对象是类的一个实例,是一个具体的事物,类与对象是抽象与具体的关系。
类的定义
Objective-C中,定义一个类,需要 XXX.h 和 XXX.m 两个文件。
1..h文件:
放类的声明,包括成员变量、属性和方法声明(事实上.h文件不参与编译过程);关键字@interface声明一个类,同时它必须以@end结束,在这两个关键字中间声明相关成员;
@interface newClassName:ParentClassName
{
定义属性(全局变量/实例变量);
}
方法的声明;
@end
2..m文件:
放属性、方法的具体实现;关键字@implementation用于实现某个类,同时必须以@end结尾,在这两个关键字中间实现具体的属性、方法;
@inplementation newClassName
方法的实现
{
code;
}
3.NSObject类
Objective-C 类中,所有的类都继承于 NSObject 类,由于这个类在Foundation框架中定义,所以需要导入
方法
1.方法的声明
方法的定义格式: 方法说明(返回类型)方法名:(参数类型)参数名称;
方法的说明有两种:
· 减号 “-“,表示该方法是对象方法,必须用对象实例才能调用。
· 加好 “+”,表示该方法为类方法,可以用类直接调用。
看个例子:
- (void)setBounds:(ShapeRect)bounds;
该方法的名称为 “setBounds:” ,冒号是包含在名称里的。
再看一个多参数方法的声明:
- (void)setName:(NSString *)name setAge:(NSInteger)age;
该方法的名称为 “setName:setAge:”
2.实例化对象
使用 alloc 来创建一个对象,编译器会给该对象分配一块可用的内存地址,然后使用 init 对对象进行初始化,对象才可以使用。如:
NSObject *object = [[NSObject alloc] init];
Person *person = [[Person alloc] init];
3.方法的调用
Objective-C 中,方法的调用方式为:
对象方法:[对象变量 方法名 参数];
类方法:[类名 方法名 参数];
例如:
[person setName:@"zhangsan"];
多个参数的对象方法调用:
[person setName:@"lisi" setAge:22];
类的初始化
1.自定义初始化方法
类的初始化方法名称必须以 init 开头,例如:
- (id)initWithName:(NSString *)name addAge:(NSInteger)age;
在类的实现文件中,则:
- (id)initWithName:(NSString *)name addAge:(NSInteger)age
{
//调用父类的初始化方法
self = [super init];
if(self != nil){
self.name = name;
self.age = age;
}
}
self 指代当前类对象,super 代表的是父类,这段代码是通过父类的方法给当前对象赋值,然后判断这个对象是否为 nil ,如果不为 nil 则给 name 和 age 属性赋值。
使用初始化方法:
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] initWithName:@"zhangsan" addAge:18];
NSLog(@"name:%@, age:%@", person.name, person.age);
}
}
2.点语法
点语法可以用来代替 get/set 方法,例如:
person.name = @"zhangsan";
[person setName = @"zhangsan"];
以上两条代码效果是一样的。但是,在Objective-C中使用点语法有两个条件:
· 必须是属性。
· 有对应的 set/get 方法。
需要注意的是点语法和 self,例如:
- (void)setAge:(NSInteger)age{
self.age = age;
}
因为 Objective-C 中点语法的本质是方法调用,第二行代码相当于 [self setAge:age],所以会造成循环调用 setAge: 方法,造成死循环。